struct Player {
    name: String,
    iq: u8,
    friends: u8,
}
// 实现指定类型的方法
impl Player {
    // 根据name构建player
    // 关联方法，没有&self作为第一个参数，相当于静态初始化方法
    // 「结构体::方法名」 来调用
    fn with_name(name: &str) -> Player {
        Player {
            name: name.to_string(),
            iq: 100,
            friends: 100,
        }
    }
    // 实例方法，有&self作为第一个参数
    // 调用时需要传递具体的实例对象的应用
    // 「结构体::方法名(实例对象)」
    // self相当于this
    // 语法糖 可简写为 「实例对象.方法」 直接调用
    // &符表示借用所有权，不加&将直接移动所有权，方法结束后该实例将不能再被使用
    fn get_friends(&self) -> u8 {
        self.friends
    }

    fn set_friends(&mut self, count: u8) {
        self.friends = count;
    }
}

fn main() {
    let mut player = Player::with_name("Dave");
    player.set_friends(23);
    println!("{}'s friends count: {}", player.name, player.get_friends());

    // 另一种调用方式
    // player.get_friends() 等价于 Player::get_friends(&player)
    let count = Player::get_friends(&player);
    println!("count: {}", count);
}